home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / Visual Cafe Pro v1.0 / VISCAFE.BIN / MultiList.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-06-19  |  18.4 KB  |  1,147 lines

  1. package symantec.itools.awt;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Container;
  6. import java.awt.Dimension;
  7. import java.awt.Event;
  8. import java.awt.Font;
  9. import java.awt.FontMetrics;
  10. import java.awt.Frame;
  11. import java.awt.Graphics;
  12. import java.awt.Image;
  13. import java.awt.LayoutManager;
  14. import java.awt.Panel;
  15. import java.awt.Rectangle;
  16. import java.awt.Scrollbar;
  17. import java.util.BitSet;
  18. import java.util.StringTokenizer;
  19. import java.util.Vector;
  20. import symantec.beans.Beans;
  21.  
  22. public class MultiList extends Panel {
  23.    public static final long CLICKTHRESHOLD = 250L;
  24.    public static final int LEFT = 0;
  25.    public static final int CENTER = 1;
  26.    public static final int RIGHT = 2;
  27.    static CompareCells func = new CompareCells();
  28.    Color colorBg;
  29.    Color colorFg;
  30.    Color colorHBg;
  31.    Color colorHFg;
  32.    Matrix cells;
  33.    boolean multiSelect;
  34.    int[] splitters;
  35.    String[] headings;
  36.    int[] align;
  37.    Image[] cellIm;
  38.    int[] columnSizes;
  39.    Color headingBg;
  40.    Color headingFg;
  41.    Font headingFont;
  42.    Font cellFont;
  43.    Scrollbar sbV;
  44.    Scrollbar sbH;
  45.    int cursor;
  46.    int colClick;
  47.    int memoryClick;
  48.    long clickTime;
  49.    BitSet highlightedRows;
  50.    int selectedRow;
  51.    int topRow;
  52.    int dragColumn;
  53.    int xDragLast;
  54.    boolean isDragging;
  55.    int headingHeight;
  56.    int cellHeight;
  57.    int cellAscent;
  58.    int cellDescent;
  59.    int clickMargin;
  60.    int currentCursor;
  61.    // $FF: renamed from: im java.awt.Image
  62.    Image field_0;
  63.    // $FF: renamed from: gg java.awt.Graphics
  64.    Graphics field_1;
  65.    int height;
  66.    int width;
  67.    int sbVPosition;
  68.    int sbHPosition;
  69.    int sbVWidth;
  70.    int sbHHeight;
  71.    boolean sbVShow;
  72.    boolean sbHShow;
  73.    int minColumnWidth;
  74.    long scrollbarTimer;
  75.    boolean forceRedraw;
  76.    boolean needDelayedHeadingsCalc;
  77.    String[] delayedHeadings;
  78.  
  79.    public MultiList() {
  80.       this(0, false, Color.white);
  81.    }
  82.  
  83.    public MultiList(int var1) {
  84.       this(var1, false, Color.white);
  85.    }
  86.  
  87.    public MultiList(int var1, boolean var2) {
  88.       this(var1, var2, Color.white);
  89.    }
  90.  
  91.    public MultiList(int var1, boolean var2, Color var3) {
  92.       this.colorBg = Color.white;
  93.       this.colorFg = Color.black;
  94.       this.colorHBg = Color.blue;
  95.       this.colorHFg = Color.white;
  96.       this.cells = new Matrix();
  97.       this.multiSelect = false;
  98.       this.headingBg = Color.lightGray;
  99.       this.headingFg = Color.black;
  100.       this.colClick = -1;
  101.       this.memoryClick = -1;
  102.       this.highlightedRows = new BitSet();
  103.       this.dragColumn = -1;
  104.       this.xDragLast = -1;
  105.       this.clickMargin = 5;
  106.       this.height = -1;
  107.       this.width = -1;
  108.       this.sbVShow = false;
  109.       this.sbHShow = false;
  110.       this.minColumnWidth = 10;
  111.       this.forceRedraw = false;
  112.       this.needDelayedHeadingsCalc = false;
  113.       this.createColumns(var1);
  114.       this.multiSelect = var2;
  115.       ((Container)this).setLayout((LayoutManager)null);
  116.       Font var4 = new Font("Helvetica", 0, 12);
  117.       this.setHeadingFont(var4);
  118.       this.setCellFont(var4);
  119.       ((Component)this).setBackground(this.colorBg = var3);
  120.       this.sbV = new Scrollbar(1);
  121.       this.sbV.hide();
  122.       ((Container)this).add(this.sbV);
  123.       this.sbH = new Scrollbar(0);
  124.       this.sbH.hide();
  125.       ((Container)this).add(this.sbH);
  126.    }
  127.  
  128.    public void selectAll() {
  129.       if (this.getNumberOfRows() != 0) {
  130.          if (this.multiSelect) {
  131.             this.changeSelection(0, 0);
  132.             this.changeSelection(this.getNumberOfRows() - 1, 1);
  133.          }
  134.  
  135.       }
  136.    }
  137.  
  138.    public void setColumns(int var1) {
  139.       this.createColumns(var1);
  140.    }
  141.  
  142.    public int getNumberOfRows() {
  143.       return this.cells.rows();
  144.    }
  145.  
  146.    public void setHeading(String var1, int var2, int var3) {
  147.       this.headings[var2] = var1;
  148.       this.splitters[var2 + 1] = var3;
  149.       if (this.columnSizes == null) {
  150.          this.columnSizes = new int[this.headings.length];
  151.       }
  152.  
  153.       for(int var4 = 0; var4 < this.headings.length; ++var4) {
  154.          this.columnSizes[var4] = this.splitters[var4 + 1] - this.splitters[var4];
  155.       }
  156.  
  157.       this.forceRedraw = true;
  158.       ((Component)this).repaint();
  159.    }
  160.  
  161.    public String getHeading(int var1) {
  162.       return this.headings[var1];
  163.    }
  164.  
  165.    public void adjustHeadings() {
  166.       if (this.headings.length == 0) {
  167.          this.createColumns(0);
  168.          ((Component)this).invalidate();
  169.       } else {
  170.          Dimension var1 = ((Component)this).size();
  171.          int var2 = 0;
  172.          int var3 = (var1.width - this.sbVWidth) / this.headings.length;
  173.          int var4 = var1.width - this.sbVWidth - this.headings.length * var3;
  174.          this.splitters[0] = 0;
  175.  
  176.          for(int var5 = 0; var5 < this.headings.length; ++var5) {
  177.             this.splitters[var5 + 1] = var2 += var3 + (var5 < var4 ? 1 : 0);
  178.          }
  179.  
  180.       }
  181.    }
  182.  
  183.    public void setHeadings(String[] var1) {
  184.       var1 = this.tokenizeStringArrayIfNeeded(var1);
  185.       if (var1.length == 0) {
  186.          this.createColumns(0);
  187.          ((Component)this).invalidate();
  188.       } else {
  189.          this.calcHeadings(var1);
  190.       }
  191.  
  192.       this.forceRedraw = true;
  193.       ((Component)this).repaint();
  194.    }
  195.  
  196.    public String[] getHeadings() {
  197.       return this.headings;
  198.    }
  199.  
  200.    public void setHeadingFont(Font var1) {
  201.       this.headingFont = var1;
  202.       this.headingHeight = ((Component)this).getFontMetrics(var1).getHeight() + 4;
  203.       this.forceRedraw = true;
  204.       ((Component)this).repaint();
  205.    }
  206.  
  207.    public Font getHeadingFont() {
  208.       return this.headingFont;
  209.    }
  210.  
  211.    public void setCellFont(Font var1) {
  212.       this.cellFont = var1;
  213.       this.cellAscent = ((Component)this).getFontMetrics(var1).getAscent();
  214.       this.cellDescent = ((Component)this).getFontMetrics(var1).getDescent();
  215.       this.cellHeight = ((Component)this).getFontMetrics(var1).getHeight();
  216.       this.forceRedraw = true;
  217.       ((Component)this).repaint();
  218.    }
  219.  
  220.    public Font getCellFont() {
  221.       return this.cellFont;
  222.    }
  223.  
  224.    public void setHeadingColors(Color var1, Color var2) {
  225.       this.headingFg = var1;
  226.       this.headingBg = var2;
  227.       this.forceRedraw = true;
  228.       ((Component)this).repaint();
  229.    }
  230.  
  231.    public void setHeadingFg(Color var1) {
  232.       this.headingFg = var1;
  233.       this.forceRedraw = true;
  234.       ((Component)this).repaint();
  235.    }
  236.  
  237.    public void setHeadingBg(Color var1) {
  238.       this.headingBg = var1;
  239.       this.forceRedraw = true;
  240.       ((Component)this).repaint();
  241.    }
  242.  
  243.    public Color getHeadingFg() {
  244.       return this.headingFg;
  245.    }
  246.  
  247.    public Color getHeadingBg() {
  248.       return this.headingBg;
  249.    }
  250.  
  251.    public void setCellColors(Color var1, Color var2) {
  252.       this.colorFg = var1;
  253.       this.colorBg = var2;
  254.       this.forceRedraw = true;
  255.       ((Component)this).repaint();
  256.    }
  257.  
  258.    public void setCellFg(Color var1) {
  259.       this.colorFg = var1;
  260.       this.forceRedraw = true;
  261.       ((Component)this).repaint();
  262.    }
  263.  
  264.    public void setCellBg(Color var1) {
  265.       this.colorBg = var1;
  266.       this.forceRedraw = true;
  267.       ((Component)this).repaint();
  268.    }
  269.  
  270.    public Color getCellFg() {
  271.       return this.colorFg;
  272.    }
  273.  
  274.    public Color getCellBg() {
  275.       return this.colorBg;
  276.    }
  277.  
  278.    public String[] getColumnAlignments() {
  279.       String[] var1 = new String[this.align.length];
  280.  
  281.       for(int var2 = 0; var2 < var1.length; ++var2) {
  282.          if (this.align[var2] == 0) {
  283.             var1[var2] = "Left";
  284.          } else if (this.align[var2] == 1) {
  285.             var1[var2] = "Center";
  286.          } else if (this.align[var2] == 2) {
  287.             var1[var2] = "Right";
  288.          } else {
  289.             var1[var2] = "Left";
  290.          }
  291.       }
  292.  
  293.       return var1;
  294.    }
  295.  
  296.    public void setColumnAlignments(String[] var1) {
  297.       var1 = this.tokenizeStringArrayIfNeeded(var1);
  298.       if (var1.length > 0) {
  299.          this.align = new int[var1.length];
  300.  
  301.          for(int var4 = 0; var4 < var1.length; ++var4) {
  302.             if (var1[var4] != null) {
  303.                if (var1[var4].equalsIgnoreCase("Left")) {
  304.                   this.align[var4] = 0;
  305.                } else if (var1[var4].equalsIgnoreCase("Center")) {
  306.                   this.align[var4] = 1;
  307.                } else if (var1[var4].equalsIgnoreCase("Right")) {
  308.                   this.align[var4] = 2;
  309.                } else {
  310.                   this.align[var4] = 0;
  311.                }
  312.             } else {
  313.                this.align[var4] = 0;
  314.             }
  315.          }
  316.  
  317.       } else {
  318.          this.align = new int[this.headings.length];
  319.  
  320.          for(int var2 = 0; var2 < this.headings.length; ++var2) {
  321.             this.align[var2] = 0;
  322.          }
  323.  
  324.       }
  325.    }
  326.  
  327.    public String[] getColumnSizes() {
  328.       String[] var1 = new String[this.columnSizes.length];
  329.  
  330.       for(int var2 = 0; var2 < var1.length; ++var2) {
  331.          try {
  332.             var1[var2] = String.valueOf(this.columnSizes[var2]);
  333.          } catch (Exception var3) {
  334.             var1[var2] = "";
  335.          }
  336.       }
  337.  
  338.       return var1;
  339.    }
  340.  
  341.    public void setColumnSizes(String[] var1) {
  342.       var1 = this.tokenizeStringArrayIfNeeded(var1);
  343.       if (var1.length <= 0) {
  344.          this.columnSizes = null;
  345.          this.adjustHeadings();
  346.       } else {
  347.          this.columnSizes = new int[var1.length];
  348.          int var2 = 0;
  349.  
  350.          for(int var3 = 0; var3 < var1.length; ++var3) {
  351.             try {
  352.                if (var1[var3] != null) {
  353.                   this.columnSizes[var3] = Integer.parseInt(var1[var3]);
  354.                   if (this.splitters.length >= var3) {
  355.                      this.splitters[var3 + 1] = var2 += this.columnSizes[var3];
  356.                   }
  357.                }
  358.             } catch (Exception var4) {
  359.                this.columnSizes[var3] = 10;
  360.                if (this.splitters.length >= var3) {
  361.                   int var10001 = var3 + 1;
  362.                   var2 += 10;
  363.                   this.splitters[var10001] = var2;
  364.                }
  365.             }
  366.          }
  367.  
  368.          this.splitters[0] = 0;
  369.       }
  370.    }
  371.  
  372.    public int getColumnSize(int var1) {
  373.       return this.splitters[var1 + 1];
  374.    }
  375.  
  376.    public void setColumnAlignment(int var1, int var2) {
  377.       this.align[var1] = var2;
  378.    }
  379.  
  380.    public int getNumberOfCols() {
  381.       return this.headings.length;
  382.    }
  383.  
  384.    public void setSelectedRow(int var1) throws IllegalArgumentException {
  385.       if (this.selectedRow != var1) {
  386.          if (var1 > this.cells.rows()) {
  387.             throw new IllegalArgumentException(var1 + " is not a valid row number");
  388.          }
  389.  
  390.          this.selectedRow = var1;
  391.          this.changeSelection(this.selectedRow, 0);
  392.       }
  393.  
  394.    }
  395.  
  396.    public int getSelectedRow() {
  397.       return this.selectedRow;
  398.    }
  399.  
  400.    public int[] getSelectedRows() {
  401.       int var1 = this.highlightedRows.size();
  402.       int var2 = 0;
  403.  
  404.       for(int var3 = 0; var3 < var1; ++var3) {
  405.          if (this.highlightedRows.get(var3)) {
  406.             ++var2;
  407.          }
  408.       }
  409.  
  410.       int[] var4 = new int[var2];
  411.       var2 = 0;
  412.  
  413.       for(int var5 = 0; var5 < var1; ++var5) {
  414.          if (this.highlightedRows.get(var5)) {
  415.             var4[var2++] = var5;
  416.          }
  417.       }
  418.  
  419.       return var4;
  420.    }
  421.  
  422.    public void setMinColumnWidth(int var1) {
  423.       if (var1 > 0) {
  424.          this.minColumnWidth = var1;
  425.       }
  426.  
  427.    }
  428.  
  429.    public int getMinColumnWidth() {
  430.       return this.minColumnWidth;
  431.    }
  432.  
  433.    public boolean mouseDown(Event var1, int var2, int var3) {
  434.       if (var3 < this.headingHeight) {
  435.          for(int var7 = 1; var7 < this.splitters.length; ++var7) {
  436.             if (var2 < Math.min(this.splitters[var7] - this.sbHPosition + this.clickMargin, ((Component)this).size().width - this.sbVWidth) && var2 > this.splitters[var7] - this.sbHPosition - this.clickMargin) {
  437.                this.dragColumn = var7;
  438.                this.isDragging = true;
  439.                this.mouseDrag(var1, var2, var3);
  440.                return true;
  441.             }
  442.          }
  443.  
  444.          for(int var8 = 0; var8 < this.headings.length; ++var8) {
  445.             if (var2 > this.splitters[var8] - this.sbHPosition && var2 < this.splitters[var8 + 1] - this.sbHPosition) {
  446.                this.colClick = var8;
  447.                this.drawHeading(true);
  448.                ((Component)this).repaint();
  449.                return true;
  450.             }
  451.          }
  452.  
  453.          return true;
  454.       } else if (var2 > this.width) {
  455.          return false;
  456.       } else {
  457.          int var4 = this.selectedRow;
  458.          this.changeSelection((var3 - this.headingHeight - 4) / this.cellHeight + this.topRow, var1.modifiers);
  459.          if (this.selectedRow == var4 || var4 < 0) {
  460.             long var5 = var1.when - this.clickTime;
  461.             if (var5 < 250L) {
  462.                this.postEvent(1001, this.selectedRow);
  463.             }
  464.          }
  465.  
  466.          this.clickTime = var1.when;
  467.          return false;
  468.       }
  469.    }
  470.  
  471.    public boolean mouseDrag(Event var1, int var2, int var3) {
  472.       Dimension var4 = ((Component)this).size();
  473.       if (this.isDragging) {
  474.          if (var2 < 0) {
  475.             var2 = 0;
  476.          }
  477.  
  478.          if (var2 + this.sbHPosition < this.splitters[this.dragColumn - 1] + this.minColumnWidth) {
  479.             return true;
  480.          } else {
  481.             Graphics var8 = ((Component)this).getGraphics();
  482.             var8.setColor(this.colorBg);
  483.             var8.setXORMode(Color.black);
  484.             var8.drawLine(this.xDragLast, 0, this.xDragLast, var4.height);
  485.             var8.drawLine(var2, 0, var2, var4.height);
  486.             var8.setColor(Color.black);
  487.             var8.setPaintMode();
  488.             var8.dispose();
  489.             this.xDragLast = var2;
  490.             return true;
  491.          }
  492.       } else {
  493.          if (this.colClick > -1) {
  494.             int var6;
  495.             if (this.colClick == 0) {
  496.                var6 = 0;
  497.             } else {
  498.                var6 = this.splitters[this.colClick] - this.sbHPosition;
  499.             }
  500.  
  501.             int var5;
  502.             if (this.colClick == this.headings.length - 1) {
  503.                var5 = var4.width;
  504.             } else {
  505.                var5 = this.splitters[this.colClick + 1] - this.sbHPosition;
  506.             }
  507.  
  508.             if (var2 < var6 || var2 > var5 || var3 > this.headingHeight || var3 < 0) {
  509.                this.memoryClick = this.colClick;
  510.                this.colClick = -1;
  511.                this.drawHeading(false);
  512.                ((Component)this).repaint();
  513.             }
  514.          } else if (this.memoryClick > -1) {
  515.             int var9;
  516.             if (this.memoryClick == 0) {
  517.                var9 = 0;
  518.             } else {
  519.                var9 = this.splitters[this.memoryClick] - this.sbHPosition;
  520.             }
  521.  
  522.             int var7;
  523.             if (this.memoryClick == this.headings.length - 1) {
  524.                var7 = var4.width;
  525.             } else {
  526.                var7 = this.splitters[this.memoryClick + 1] - this.sbHPosition;
  527.             }
  528.  
  529.             if (var2 > var9 && var2 < var7 && var3 < this.headingHeight && var3 > 0) {
  530.                this.colClick = this.memoryClick;
  531.                this.memoryClick = -1;
  532.                this.drawHeading(false);
  533.                ((Component)this).repaint();
  534.             }
  535.          }
  536.  
  537.          return true;
  538.       }
  539.    }
  540.  
  541.    public boolean mouseUp(Event var1, int var2, int var3) {
  542.       if (!this.isDragging) {
  543.          if (this.colClick != -1) {
  544.             this.highlightedRows = new BitSet();
  545.             this.selectedRow = -1;
  546.             this.cells.sort(func, this.colClick);
  547.             this.colClick = -1;
  548.             this.forceRedraw = true;
  549.             ((Component)this).repaint();
  550.             return true;
  551.          } else {
  552.             return false;
  553.          }
  554.       } else {
  555.          if (var2 < 0) {
  556.             var2 = 0;
  557.          }
  558.  
  559.          this.xDragLast = Math.max(this.splitters[this.dragColumn - 1] + this.minColumnWidth, var2 + this.sbHPosition);
  560.  
  561.          for(int var4 = this.dragColumn + 1; var4 < this.splitters.length; ++var4) {
  562.             int[] var10000 = this.splitters;
  563.             var10000[var4] += this.xDragLast - this.splitters[this.dragColumn];
  564.          }
  565.  
  566.          this.splitters[this.dragColumn] = this.xDragLast;
  567.          this.xDragLast = -1;
  568.          this.isDragging = false;
  569.          this.forceRedraw = true;
  570.          ((Component)this).repaint();
  571.          return true;
  572.       }
  573.    }
  574.  
  575.    public boolean mouseMove(Event var1, int var2, int var3) {
  576.       boolean var4 = false;
  577.       if (var3 < this.headingHeight) {
  578.          for(int var5 = 1; var5 < this.splitters.length; ++var5) {
  579.             if (var2 < Math.min(this.splitters[var5] - this.sbHPosition + this.clickMargin, ((Component)this).size().width - this.sbVWidth) && var2 > this.splitters[var5] - this.sbHPosition - this.clickMargin) {
  580.                var4 = true;
  581.             }
  582.          }
  583.       }
  584.  
  585.       int var7 = var4 ? 10 : 0;
  586.       if (var7 != this.currentCursor) {
  587.          Frame var6 = this.frame();
  588.          if (var6 != null) {
  589.             var6.setCursor(this.currentCursor = var7);
  590.          }
  591.       }
  592.  
  593.       return false;
  594.    }
  595.  
  596.    public boolean keyDown(Event var1, int var2) {
  597.       switch (var2) {
  598.          case 10:
  599.             if (this.selectedRow > -1) {
  600.                this.postEvent(1001, this.selectedRow);
  601.             }
  602.             break;
  603.          case 1002:
  604.             this.changeSelection(this.selectedRow - this.getPageSize(), var1.modifiers);
  605.             break;
  606.          case 1003:
  607.             this.changeSelection(this.selectedRow + this.getPageSize(), var1.modifiers);
  608.             break;
  609.          case 1004:
  610.             if (this.selectedRow > 0) {
  611.                this.changeSelection(this.selectedRow - 1, var1.modifiers);
  612.             }
  613.             break;
  614.          case 1005:
  615.             if (this.selectedRow < this.cells.rows() - 1) {
  616.                this.changeSelection(this.selectedRow + 1, var1.modifiers);
  617.             }
  618.       }
  619.  
  620.       return false;
  621.    }
  622.  
  623.    public boolean handleEvent(Event var1) {
  624.       if (var1.target == this.sbV && var1.arg != null && this.topRow != this.sbV.getValue()) {
  625.          this.topRow = this.sbV.getValue();
  626.          this.sbVPosition = this.topRow;
  627.          this.forceRedraw = true;
  628.          ((Component)this).repaint();
  629.       }
  630.  
  631.       if (var1.target == this.sbH && var1.arg != null && this.sbHPosition != this.sbH.getValue()) {
  632.          this.sbHPosition = this.sbH.getValue();
  633.          ((Component)this).repaint();
  634.       }
  635.  
  636.       return super.handleEvent(var1);
  637.    }
  638.  
  639.    public void createColumns(int var1) {
  640.       this.headings = new String[var1];
  641.       this.align = new int[var1];
  642.       this.splitters = new int[var1 + 1];
  643.       this.cellIm = new Image[var1];
  644.       this.columnSizes = null;
  645.    }
  646.  
  647.    public void clear() {
  648.       this.cells.removeAllElements();
  649.       this.xDragLast = -1;
  650.       this.isDragging = false;
  651.       this.selectedRow = 0;
  652.       this.highlightedRows = new BitSet();
  653.       this.topRow = 0;
  654.       this.sbVPosition = 0;
  655.       this.forceRedraw = true;
  656.       ((Component)this).repaint();
  657.    }
  658.  
  659.    public void removeRow(int var1) {
  660.       if (var1 != -1) {
  661.          int var2 = this.cells.rows();
  662.          this.cells.removeRow(var1);
  663.          if (this.highlightedRows.get(var1)) {
  664.             this.highlightedRows.clear(var1);
  665.          }
  666.  
  667.          for(int var3 = var1 + 1; var3 < var2; ++var3) {
  668.             if (this.highlightedRows.get(var3)) {
  669.                this.highlightedRows.clear(var3);
  670.                this.highlightedRows.set(var3 - 1);
  671.             }
  672.          }
  673.  
  674.          this.forceRedraw = true;
  675.          ((Component)this).repaint();
  676.       }
  677.    }
  678.  
  679.    public void addTextCell(int var1, int var2, String var3) {
  680.       Cell var4 = new Cell(this, var3);
  681.       this.cells.updateElement(var1, var2, var4);
  682.       this.forceRedraw = true;
  683.       ((Component)this).repaint();
  684.    }
  685.  
  686.    public void addImageCell(int var1, int var2, Image var3) {
  687.       Cell var4 = new Cell(this, var3);
  688.       this.cells.updateElement(var1, var2, var4);
  689.       this.forceRedraw = true;
  690.       ((Component)this).repaint();
  691.    }
  692.  
  693.    public void addCell(int var1, int var2, String var3, Image var4) {
  694.       Cell var5 = new Cell(this, var3, var4);
  695.       this.cells.updateElement(var1, var2, var5);
  696.       this.forceRedraw = true;
  697.       ((Component)this).repaint();
  698.    }
  699.  
  700.    public String getCellText(int var1, int var2) {
  701.       try {
  702.          Cell var3 = (Cell)this.cells.elementAt(var1, var2);
  703.          if (var3 != null) {
  704.             return var3.text;
  705.          }
  706.       } catch (ArrayIndexOutOfBoundsException var4) {
  707.       }
  708.  
  709.       return "";
  710.    }
  711.  
  712.    public Image getCellImage(int var1, int var2) {
  713.       try {
  714.          Cell var3 = (Cell)this.cells.elementAt(var1, var2);
  715.          if (var3 != null) {
  716.             return var3.im;
  717.          }
  718.       } catch (ArrayIndexOutOfBoundsException var4) {
  719.       }
  720.  
  721.       return null;
  722.    }
  723.  
  724.    public void setListItems(String[] var1) {
  725.       this.clear();
  726.  
  727.       for(int var2 = 0; var2 < var1.length; ++var2) {
  728.          String var3 = var1[var2];
  729.          if (var3 == null) {
  730.             var3 = "";
  731.          }
  732.  
  733.          int var4 = var3.length();
  734.          int var5 = 0;
  735.          int var7 = 0;
  736.  
  737.          for(int var6 = 0; var6 <= var4 && var7 < this.headings.length; ++var6) {
  738.             if (var6 == var4 || var3.charAt(var6) == ';') {
  739.                this.addCell(var2, var7++, var3.substring(var5, var6), (Image)null);
  740.                var5 = var6 + 1;
  741.             }
  742.          }
  743.  
  744.          while(var7 < this.headings.length) {
  745.             this.addCell(var2, var7++, "", (Image)null);
  746.          }
  747.       }
  748.  
  749.       this.forceRedraw = true;
  750.       ((Component)this).repaint();
  751.    }
  752.  
  753.    public String[] getListItems() {
  754.       new Vector();
  755.       String[] var5 = new String[this.cells.rows()];
  756.  
  757.       for(int var2 = 0; var2 < this.cells.rows(); ++var2) {
  758.          String var4 = "";
  759.  
  760.          for(int var3 = 0; var3 < this.headings.length; ++var3) {
  761.             String var1 = this.getCellText(var2, var3);
  762.             if (var3 != 0) {
  763.                var4 = var4 + ";";
  764.             }
  765.  
  766.             var4 = var4 + (var1 != null ? var1 : "");
  767.          }
  768.  
  769.          var5[var2] = var4;
  770.       }
  771.  
  772.       return var5;
  773.    }
  774.  
  775.    public void update(Graphics var1) {
  776.       this.paint(var1);
  777.    }
  778.  
  779.    public void paint(Graphics var1) {
  780.       if (this.field_0 == null) {
  781.          this.redraw();
  782.       }
  783.  
  784.       if (this.field_0 != null) {
  785.          Font var2 = var1.getFont();
  786.          if (var2 == null) {
  787.             var2 = this.headingFont;
  788.             ((Component)this).setFont(var2);
  789.             return;
  790.          }
  791.  
  792.          Dimension var3 = ((Component)this).size();
  793.          if (this.width != var3.width || this.height != var3.height || this.forceRedraw || Beans.isDesignTime()) {
  794.             this.redraw();
  795.          }
  796.  
  797.          var1.translate(-this.sbHPosition, 0);
  798.          if (this.sbVShow && this.sbHShow) {
  799.             var1.setColor(Color.lightGray);
  800.             var1.fillRect(this.sbHPosition + var3.width - this.sbVWidth, var3.height - this.sbHHeight, this.sbVWidth, this.sbHHeight);
  801.          }
  802.  
  803.          var1.clipRect(this.sbHPosition, 0, var3.width - this.sbVWidth, var3.height - this.sbHHeight);
  804.          var1.drawImage(this.field_0, 0, 0, this);
  805.          var1.setColor(Color.black);
  806.          var1.drawRect(this.sbHPosition, 0, var3.width - 1, var3.height - 1);
  807.       }
  808.  
  809.    }
  810.  
  811.    public void redraw() {
  812.       Dimension var1 = ((Component)this).size();
  813.       this.forceRedraw = false;
  814.       if (var1.width != 0 && var1.height != 0) {
  815.          if (this.needDelayedHeadingsCalc) {
  816.             this.calcHeadings(this.delayedHeadings);
  817.          }
  818.  
  819.          if (this.cellHeight > 0 && this.cells.rows() * this.cellHeight > var1.height - this.headingHeight) {
  820.             this.sbVShow = true;
  821.             this.sbVWidth = this.sbV.preferredSize().width;
  822.          } else {
  823.             this.sbVShow = false;
  824.             this.sbVWidth = 0;
  825.             this.sbVPosition = 0;
  826.          }
  827.  
  828.          if (this.width != var1.width - this.sbVWidth && this.columnSizes == null) {
  829.             this.adjustHeadings();
  830.          }
  831.  
  832.          if (this.splitters[this.splitters.length - 1] > var1.width - this.sbVWidth) {
  833.             this.sbHShow = true;
  834.             this.sbHHeight = this.sbH.preferredSize().height;
  835.          } else {
  836.             this.sbHShow = false;
  837.             this.sbHHeight = 0;
  838.             this.sbHPosition = 0;
  839.          }
  840.  
  841.          if (this.width != var1.width - this.sbVWidth || this.height != var1.height || this.field_1 == null || this.field_0.getWidth(this) != this.splitters[this.splitters.length - 1]) {
  842.             this.field_0 = ((Component)this).createImage(Math.max(this.splitters[this.splitters.length - 1], var1.width + this.sbHPosition), var1.height);
  843.             this.width = var1.width - this.sbVWidth;
  844.             this.height = var1.height;
  845.             if (this.field_1 != null) {
  846.                this.field_1.dispose();
  847.                this.field_1 = null;
  848.             }
  849.  
  850.             if (this.field_0 != null) {
  851.                this.field_1 = this.field_0.getGraphics();
  852.             }
  853.          }
  854.  
  855.          if (this.field_1 != null) {
  856.             this.field_1.setColor(this.colorBg);
  857.             this.field_1.fillRect(0, 0, Math.max(this.splitters[this.splitters.length - 1], var1.width + this.sbHPosition), var1.height);
  858.          }
  859.  
  860.          if (this.sbVShow) {
  861.             int var2 = (this.height - this.headingHeight) / this.cellHeight;
  862.             this.sbV.reshape(var1.width - this.sbVWidth, 0, this.sbVWidth, var1.height - this.sbHHeight);
  863.             this.sbV.setValues(this.sbVPosition, var2, 0, this.cells.rows() - var2);
  864.             this.sbV.setPageIncrement(1);
  865.             this.sbV.show();
  866.          } else {
  867.             this.topRow = 0;
  868.             this.sbV.hide();
  869.          }
  870.  
  871.          if (this.sbHShow) {
  872.             this.sbH.reshape(0, var1.height - this.sbHHeight, var1.width - this.sbVWidth, this.sbHHeight);
  873.             this.sbH.setValues(this.sbHPosition, var1.width - this.sbVWidth, 0, this.splitters[this.splitters.length - 1] - var1.width + this.sbVWidth);
  874.             this.sbH.setPageIncrement(1);
  875.             this.sbH.show();
  876.          } else {
  877.             this.sbH.hide();
  878.          }
  879.  
  880.          if (this.field_1 != null) {
  881.             this.field_1.setFont(this.headingFont);
  882.             this.drawHeading(false);
  883.             this.field_1.clipRect(0, 0, this.splitters[this.splitters.length - 1], var1.height);
  884.          }
  885.  
  886.          int var3 = this.topRow + (this.cellHeight > 0 ? (this.height - 3) / this.cellHeight - 1 : 0);
  887.          if (var3 > this.cells.rows()) {
  888.             var3 = this.cells.rows();
  889.          }
  890.  
  891.          if (this.field_1 != null) {
  892.             this.field_1.setFont(this.cellFont);
  893.             this.drawRows(0, var3, this.topRow);
  894.          }
  895.  
  896.       }
  897.    }
  898.  
  899.    public synchronized void reshape(int var1, int var2, int var3, int var4) {
  900.       super.reshape(var1, var2, var3, var4);
  901.       if (this.columnSizes == null) {
  902.          this.adjustHeadings();
  903.       }
  904.  
  905.    }
  906.  
  907.    void drawRows(int var1, int var2, int var3) {
  908.       MatrixEnumeration var4 = this.cells.elements();
  909.       Cell var5 = null;
  910.       int var8 = this.headings.length;
  911.       if (var3 > 0) {
  912.          var5 = (Cell)var4.advanceTo(var3);
  913.       }
  914.  
  915.       while(var4.hasMoreElements() || var5 != null) {
  916.          int var6 = 1;
  917.  
  918.          for(int var9 = 0; var9 < var8; ++var9) {
  919.             int var7 = this.splitters[var9 + 1] - this.splitters[var9];
  920.             this.field_1.setColor(this.highlightedRows.get(var3) ? this.colorHBg : this.colorBg);
  921.             this.field_1.fillRect(var6, this.headingHeight + var1 * this.cellHeight + 4, var7 + 4, this.cellHeight);
  922.             this.field_1.setColor(this.highlightedRows.get(var3) ? this.colorHFg : this.colorFg);
  923.             if (var5 == null) {
  924.                var5 = (Cell)var4.nextElement();
  925.             }
  926.  
  927.             if (var5 != null && var4.currRow() == var3 && var4.currCol() == var9) {
  928.                var5.drawCell(this.field_1, this.align[var9], this.splitters[var9] + 3, this.headingHeight + var1 * this.cellHeight + 4, var7, this.cellHeight, this.cellAscent);
  929.                var5 = null;
  930.             }
  931.  
  932.             if (var5 != null && var4.currRow() < var3) {
  933.                var5 = null;
  934.             }
  935.  
  936.             var6 = this.splitters[var9 + 1] - 3;
  937.          }
  938.  
  939.          --var2;
  940.          if (var2 == 0) {
  941.             break;
  942.          }
  943.  
  944.          ++var3;
  945.          ++var1;
  946.       }
  947.  
  948.    }
  949.  
  950.    boolean postEvent(int var1, int var2) {
  951.       return ((Component)this).postEvent(new Event(this, var1, new Integer(var2)));
  952.    }
  953.  
  954.    int getPageSize() {
  955.       return ((Component)this).size().height / this.cellHeight;
  956.    }
  957.  
  958.    void draw3DBox(Rectangle var1, boolean var2) {
  959.       int var3 = var1.x;
  960.       int var4 = var1.y;
  961.       int var5 = var1.x + var1.width;
  962.       int var6 = var1.y + var1.height;
  963.       this.field_1.setColor(var2 ? Color.black : Color.white);
  964.       this.field_1.drawLine(var5, var4, var5, var6);
  965.       this.field_1.drawLine(var5 + 1, var4, var5 + 1, var6);
  966.       this.field_1.drawLine(var3, var6, var5, var6);
  967.       this.field_1.drawLine(var3, var6 + 1, var5, var6 + 1);
  968.       this.field_1.setColor(var2 ? Color.white : Color.gray);
  969.       this.field_1.drawLine(var3, var4, var5 - 2, var4);
  970.       this.field_1.drawLine(var3, var4, var3, var6 - 1);
  971.    }
  972.  
  973.    void drawHeading(boolean var1) {
  974.       int var2 = 1;
  975.       byte var3 = 1;
  976.       Font var6 = ((Component)this).getFont();
  977.       this.field_1.setFont(this.headingFont);
  978.       FontMetrics var7 = this.field_1.getFontMetrics();
  979.       Dimension var8 = ((Component)this).size();
  980.  
  981.       for(int var10 = 0; var10 < this.headings.length; ++var10) {
  982.          var2 = this.splitters[var10];
  983.          int var5 = this.splitters[var10 + 1];
  984.          int var4 = var5 - var2;
  985.          Rectangle var9 = new Rectangle(var2, var3, var4 - 2, this.headingHeight);
  986.          this.draw3DBox(var9, this.colClick != var10);
  987.          this.field_1.setColor(this.headingBg);
  988.          this.field_1.fillRect(var9.x + 1, var9.y + 1, var4 - 3, this.headingHeight - 1);
  989.          this.field_1.setColor(this.headingFg);
  990.          if (this.headings[var10] != null) {
  991.             int var11 = var7.stringWidth(this.headings[var10]);
  992.             int var12 = var4 - 3;
  993.             int var13 = var1 && this.colClick == var10 ? 1 : 0;
  994.             switch (this.align[var10]) {
  995.                case 0:
  996.                   this.field_1.drawString(this.headings[var10], var2 + 8 + var13, this.headingHeight - 3 + var13);
  997.                   break;
  998.                case 1:
  999.                   if (var11 > var12) {
  1000.                      this.field_1.drawString(this.headings[var10], var2 + 8 + var13, this.headingHeight - 3 + var13);
  1001.                   } else {
  1002.                      this.field_1.drawString(this.headings[var10], var2 + (var12 - var11) / 2 + var13, this.headingHeight - 3 + var13);
  1003.                   }
  1004.                   break;
  1005.                case 2:
  1006.                   if (var11 > var12) {
  1007.                      this.field_1.drawString(this.headings[var10], var2 + 8 + var13, this.headingHeight - 3 + var13);
  1008.                   } else {
  1009.                      this.field_1.drawString(this.headings[var10], var2 + var12 - var11 - 6 + var13, this.headingHeight - 3 + var13);
  1010.                   }
  1011.             }
  1012.  
  1013.             if (this.colClick == var10) {
  1014.                this.field_1.drawLine(var9.x + 1, this.headingHeight + 2, var5 - 3, this.headingHeight + 2);
  1015.             }
  1016.          }
  1017.       }
  1018.  
  1019.       if (this.splitters[this.splitters.length - 1] - 2 < this.sbHPosition + var8.width - this.sbVWidth) {
  1020.          Rectangle var15 = new Rectangle(this.splitters[this.splitters.length - 1], var3, this.sbHPosition + var8.width - this.sbVWidth - this.splitters[this.splitters.length - 1] - 2, this.headingHeight);
  1021.          this.draw3DBox(var15, true);
  1022.          this.field_1.setColor(this.headingBg);
  1023.          this.field_1.fillRect(var15.x + 1, var15.y + 1, var15.width - 1, this.headingHeight - 1);
  1024.       }
  1025.  
  1026.       this.field_1.setFont(var6);
  1027.    }
  1028.  
  1029.    Frame frame() {
  1030.       Object var1;
  1031.       for(var1 = this; var1 != null && !(var1 instanceof Frame); var1 = ((Component)var1).getParent()) {
  1032.       }
  1033.  
  1034.       return (Frame)var1;
  1035.    }
  1036.  
  1037.    public void changeSelection(int var1, int var2) {
  1038.       if (this.multiSelect) {
  1039.          switch (var2) {
  1040.             case 1:
  1041.                for(int var3 = Math.min(this.selectedRow, var1); var3 <= Math.max(this.selectedRow, var1); ++var3) {
  1042.                   if (var3 >= 0) {
  1043.                      this.highlightedRows.set(var3);
  1044.                   }
  1045.                }
  1046.                break;
  1047.             case 2:
  1048.                if (this.highlightedRows.get(var1)) {
  1049.                   this.highlightedRows.clear(var1);
  1050.                } else {
  1051.                   this.highlightedRows.set(var1);
  1052.                }
  1053.                break;
  1054.             default:
  1055.                this.highlightedRows = new BitSet();
  1056.                this.highlightedRows.set(var1);
  1057.          }
  1058.       } else {
  1059.          if (this.selectedRow >= 0) {
  1060.             this.highlightedRows.clear(this.selectedRow);
  1061.          }
  1062.  
  1063.          this.highlightedRows.set(var1);
  1064.       }
  1065.  
  1066.       int var4 = this.cells.rows();
  1067.       if (var1 > var4 - 1) {
  1068.          var1 = var4 - 1;
  1069.       } else if (var1 < 0) {
  1070.          var1 = 0;
  1071.       }
  1072.  
  1073.       if (var1 < this.topRow) {
  1074.          this.topRow = var1 - 1;
  1075.          if (this.topRow < 0) {
  1076.             this.topRow = 0;
  1077.          }
  1078.  
  1079.          this.sbVPosition = this.topRow;
  1080.          this.sbV.setValue(this.sbVPosition);
  1081.       }
  1082.  
  1083.       if (var1 >= -(this.sbHShow ? 3 : 1) + this.topRow + this.getPageSize()) {
  1084.          ++this.topRow;
  1085.          if (this.topRow > var4 - 1) {
  1086.             this.topRow = var1;
  1087.          }
  1088.  
  1089.          this.sbVPosition = this.topRow;
  1090.          this.sbV.setValue(this.sbVPosition);
  1091.       }
  1092.  
  1093.       if (this.selectedRow != var1 && var2 > 0) {
  1094.          this.postEvent(702, this.selectedRow);
  1095.       }
  1096.  
  1097.       this.selectedRow = var1;
  1098.       this.forceRedraw = true;
  1099.       ((Component)this).repaint();
  1100.       this.postEvent(701, var1);
  1101.    }
  1102.  
  1103.    public synchronized Dimension preferredSize() {
  1104.       return new Dimension(175, 125);
  1105.    }
  1106.  
  1107.    public synchronized Dimension minimumSize() {
  1108.       return new Dimension(50, 50);
  1109.    }
  1110.  
  1111.    private String[] tokenizeStringArrayIfNeeded(String[] var1) {
  1112.       if (var1.length == 1 && var1[0].indexOf(";") != -1) {
  1113.          StringTokenizer var2 = new StringTokenizer(var1[0], ";");
  1114.          int var3 = var2.countTokens();
  1115.          String[] var4 = new String[var3];
  1116.  
  1117.          for(int var5 = 0; var2.hasMoreTokens(); ++var5) {
  1118.             String var6 = var2.nextToken();
  1119.             var4[var5] = var6;
  1120.          }
  1121.  
  1122.          var1 = var4;
  1123.       }
  1124.  
  1125.       return var1;
  1126.    }
  1127.  
  1128.    private void calcHeadings(String[] var1) {
  1129.       int var2 = ((Component)this).size().width / var1.length;
  1130.       this.splitters[0] = 0;
  1131.       this.createColumns(var1.length);
  1132.       int var3 = 0;
  1133.  
  1134.       for(int var4 = 0; var4 < var1.length; ++var4) {
  1135.          this.setHeading(var1[var4], var4, var3 += var2);
  1136.       }
  1137.  
  1138.       if (((Component)this).getParent() == null) {
  1139.          this.needDelayedHeadingsCalc = true;
  1140.          this.delayedHeadings = var1;
  1141.       } else {
  1142.          this.needDelayedHeadingsCalc = false;
  1143.          this.delayedHeadings = null;
  1144.       }
  1145.    }
  1146. }
  1147.